{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fully Connected Neural Network\n",
    "\n",
    "In this example, we show how one can train a neural network on a specific task (here, Iris Classification) and use Concrete Numpy to make the model work in FHE settings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define our neural network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class FCIris(torch.nn.Module):\n",
    "    \"\"\"Neural network for Iris classification\n",
    "    \n",
    "    We define a fully connected network with three (3) fully connected (fc) layers that \n",
    "    perform feature extraction and one (fc) layer to produce the final classification. \n",
    "    We will use 3 neurons on all layers to ensure that the FHE accumulators\n",
    "    do not overflow (we are currently only allowed a maximum of 7 bits-width).\n",
    "    More information on this is available at https://docs.zama.ai/concrete-numpy/main/user/howto/reduce_needed_precision.html#limitations-for-fhe-friendly-neural-network.\n",
    "\n",
    "    Due to accumulator limits, we have to design a network with only a few neurons on each layer. \n",
    "    This is in contrast to a traditional approach where the number of neurons increases after \n",
    "    each layer or block.\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, input_size):\n",
    "        super().__init__()\n",
    "\n",
    "        # The first layer processes the input data, in our case 4 dimensional vectors \n",
    "        self.linear1 = nn.Linear(input_size, 3)\n",
    "        self.sigmoid1 = nn.Sigmoid()\n",
    "        # Next, we add a one intermediate layer\n",
    "        self.linear2 = nn.Linear(3, 3)\n",
    "        self.sigmoid2 = nn.Sigmoid()\n",
    "        # Finally, we add the decision layer for 3 output classes encoded as one-hot vectors\n",
    "        self.decision = nn.Linear(3, 3)\n",
    "\n",
    "    def forward(self, x):\n",
    "\n",
    "        x = self.linear1(x)\n",
    "        x = self.sigmoid1(x)\n",
    "        x = self.linear2(x)\n",
    "        x = self.sigmoid2(x)\n",
    "        x = self.decision(x)\n",
    "\n",
    "        return x\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define all required variables to train the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Get iris dataset\n",
    "from sklearn.datasets import load_iris\n",
    "X, y = load_iris(return_X_y=True)\n",
    "\n",
    "# Split into train and test\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)\n",
    "\n",
    "# Convert to tensors\n",
    "X_train = torch.tensor(X_train).float()\n",
    "X_test = torch.tensor(X_test).float()\n",
    "y_train = torch.tensor(y_train)\n",
    "y_test = torch.tensor(y_test)\n",
    "\n",
    "# Initialize our model\n",
    "model = FCIris(X.shape[1])\n",
    "\n",
    "# Define our loss function\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "# Define our optimizer\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.1)\n",
    "\n",
    "# Define the number of iterations\n",
    "n_iters = 50001\n",
    "\n",
    "# Define the batch size\n",
    "batch_size = 16"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train():\n",
    "    for iter in range(n_iters):\n",
    "        # Get a random batch of training data\n",
    "        idx = torch.randperm(X_train.size()[0])\n",
    "        X_batch = X_train[idx][:batch_size]\n",
    "        y_batch = y_train[idx][:batch_size]\n",
    "    \n",
    "        # Forward pass\n",
    "        y_pred = model(X_batch)\n",
    "    \n",
    "        # Compute loss\n",
    "        loss = criterion(y_pred, y_batch)\n",
    "    \n",
    "        # Backward pass\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "    \n",
    "        # Update weights\n",
    "        optimizer.step()\n",
    "    \n",
    "        \n",
    "        if iter % 1000 == 0:\n",
    "            # Print epoch number, loss and accuracy\n",
    "            accuracy = torch.sum(torch.argmax(y_pred, dim=1) == y_batch).item() / y_batch.size()[0]\n",
    "            print(f'Iterations: {iter:02} | Loss: {loss.item():.4f} | Accuracy: {100*accuracy:.2f}%')\n",
    "            if accuracy == 1:\n",
    "                break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compile the model\n",
    "\n",
    "The `compile_torch_model` applies first a quantization to `model` with `n_bits` of precision using `X_train` as the calibration dataset and compile the model to its FHE counterparts. Here we use 3 bits of precision. In some edge cases, the network accumulators can overflow (i.e. extreme quantized values in both input and weights which is unlikely). In such a case, we need to retrain the model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training a FHE friendly quantized network.\n",
      "Iterations: 00 | Loss: 1.2000 | Accuracy: 18.75%\n",
      "Iterations: 1000 | Loss: 0.5623 | Accuracy: 75.00%\n",
      "Iterations: 2000 | Loss: 0.3556 | Accuracy: 87.50%\n",
      "Iterations: 3000 | Loss: 0.0646 | Accuracy: 100.00%\n",
      "Compiling the model to FHE.\n",
      "The network is trained and FHE friendly.\n"
     ]
    }
   ],
   "source": [
    "from concrete.torch.compile import compile_torch_model\n",
    "print(\"Training a FHE friendly quantized network.\")\n",
    "for trial in range(10):\n",
    "    try:\n",
    "        train()\n",
    "        print(\"Compiling the model to FHE.\")\n",
    "        quantized_compiled_module = compile_torch_model(\n",
    "            model,\n",
    "            X_train,\n",
    "            n_bits=3,\n",
    "        )\n",
    "        print(\"The network is trained and FHE friendly.\")\n",
    "        break\n",
    "    except Exception as e:\n",
    "        if str(e).startswith(\"max_bit_width of some nodes is too high\"):\n",
    "            print(f'The network is not fully FHE friendly, retrain.')\n",
    "            train()\n",
    "        else:\n",
    "            raise e\n",
    "            break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predict with the torch model in clear"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = model(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predict with the quantized model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# We now have a module in full numpy.\n",
    "# Convert data to a numpy array.\n",
    "X_train_numpy = X_train.numpy()\n",
    "X_test_numpy = X_test.numpy()\n",
    "y_train_numpy = y_train.numpy()\n",
    "y_test_numpy = y_test.numpy()\n",
    "\n",
    "quant_model_predictions = quantized_compiled_module(X_test_numpy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predict in FHE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 38/38 [03:03<00:00,  4.84s/it]\n"
     ]
    }
   ],
   "source": [
    "from tqdm import tqdm\n",
    "homomorphic_quant_predictions = []\n",
    "for x_q in tqdm(X_test_numpy):\n",
    "    homomorphic_quant_predictions.append(\n",
    "        quantized_compiled_module.forward_fhe.run(np.array([x_q]).astype(np.uint8))\n",
    "    )\n",
    "homomorphic_predictions = quantized_compiled_module.dequantize_output(\n",
    "    np.array(homomorphic_quant_predictions, dtype=np.float32).reshape(quant_model_predictions.shape)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Print the accuracy of both models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Accuracy: 94.74%\n",
      "Test Accuracy Quantized Inference: 89.47%\n",
      "Test Accuracy Homomorphic Inference: 89.47%\n"
     ]
    }
   ],
   "source": [
    "print(f'Test Accuracy: {100*(y_pred.argmax(1) == y_test).float().mean():.2f}%')\n",
    "print(f'Test Accuracy Quantized Inference: {100*(quant_model_predictions.argmax(1) == y_test_numpy).mean():.2f}%')\n",
    "print(f'Test Accuracy Homomorphic Inference: {100*(homomorphic_predictions.argmax(1) == y_test_numpy).mean():.2f}%') "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 864x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "pca = PCA(n_components=2)\n",
    "X_train_2d = pca.fit_transform(X_train_numpy)\n",
    "\n",
    "b_min = np.min(X_train_2d, axis=0)\n",
    "b_max = np.max(X_train_2d, axis=0)\n",
    "\n",
    "grid_dims = tuple([np.linspace(b_min[i], b_max[i], 128) for i in range(X_train_2d.shape[1])])\n",
    "ndgrid_tuple = np.meshgrid(*grid_dims)\n",
    "grid_2d = np.vstack([g.ravel() for g in ndgrid_tuple]).transpose()\n",
    "\n",
    "grid_test = pca.inverse_transform(grid_2d)\n",
    "\n",
    "grid_pred_all = quantized_compiled_module(grid_test)\n",
    "grid_pred_all_original = model(torch.tensor(grid_test).float()).detach().numpy()\n",
    "\n",
    "pred_classes = np.argmax(grid_pred_all, axis=1).astype(np.int32)\n",
    "pred_classes_original = np.argmax(grid_pred_all_original, axis=1).astype(np.int32)\n",
    "\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "cmap = 'autumn'\n",
    "# Create two subplots and set their locations\n",
    "plt.clf()\n",
    "fig, axs = plt.subplots(1, 2, figsize=(12, 6))\n",
    "\n",
    "# Plot original model contour plot\n",
    "axs[0].contourf(ndgrid_tuple[0], ndgrid_tuple[1], pred_classes_original.reshape(ndgrid_tuple[0].shape), cmap=cmap)\n",
    "\n",
    "# Plot the scatter with marker borders\n",
    "axs[0].scatter(X_train_2d[:, 0], X_train_2d[:, 1], c=y_train_numpy, s=50, edgecolors='k', cmap=cmap)\n",
    "\n",
    "# Add title and axis labels\n",
    "axs[0].set_title('Original Inference')\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "# Plot quantized model contour plot\n",
    "axs[1].contourf(ndgrid_tuple[0], ndgrid_tuple[1], pred_classes.reshape(ndgrid_tuple[0].shape), cmap=cmap)\n",
    "\n",
    "# Plot the scatter with marker borders\n",
    "axs[1].scatter(X_train_2d[:, 0], X_train_2d[:, 1], c=y_train_numpy, s=50, edgecolors='k', cmap=cmap)\n",
    "\n",
    "# Add title and axis labels\n",
    "axs[1].set_title('Quantized Inference')\n",
    "\n",
    "\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the above plot, we show the decision boundaries for both the original and quantized model. The quantized model has it's decision boundaries (colored regions) slightly shifted compared to the original model. This is due to the low bit quantization applied to the model in post training.\n",
    "\n",
    "Here we do not compute the contour plot for the FHE inference as this would be really costly but it should be pretty close to the quantized model.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary\n",
    "\n",
    "In this notebook, we presented a few steps to have a model (torch neural network) inference in over homomorphically encrypted data: \n",
    "- We first trained a fully connected neural network yielding ~95% accuracy\n",
    "- Then, we quantized it using Concrete Numpy. As we can see, the extreme post training quantization (only 3 bits of precision for weights, inputs and activations) made the neural network accuracy slightly drop (~89%).\n",
    "- We then used the compiled inference into its FHE equivalent to get our FHE predictions over the test set\n",
    "\n",
    "The Homomorphic inference achieves a similar accuracy as the quantized model inference.\n",
    "\n",
    "Disclaimer: post training quantization with such a low bit width (<=3) can yield different results for the quantized model which will mainly depends on the range of the learned weights."
   ]
  }
 ],
 "metadata": {
  "execution": {
   "timeout": 10800
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
